package com.fhz.a2102shopjava.di;

import com.fhz.a2102shopjava.util.MyRunnable;

import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.RejectedExecutionHandler;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;

import javax.inject.Singleton;

import dagger.Module;
import dagger.Provides;
import dagger.hilt.InstallIn;
import dagger.hilt.components.SingletonComponent;

/**
 * 时间:2023/8/18
 *
 * @author Mr.Feng
 * 简述: 自定义线程池
 */
@Module
@InstallIn(SingletonComponent.class)
public class MyExecutorService {


    /**
     * 对线程池参数解释
     * 新任务到达→
     *
     * 如果正在运行的线程数小于corePoolSize，创建核心线程；
     * 大于等于corePoolSize，放入等待队列。
     *
     * 如果等待队列已满，但正在运行的线程数小于maximumPoolSize，
     * 创建非核心线程；大于等于maximumPoolSize，启动拒绝策略。
     *
     * 当一个线程无事可做一段时间keepAliveTime后，
     * 如果正在运行的线程数大于corePoolSize，则关闭非核心线程。
     * @return
     */
    @Provides
    @Singleton
    public ExecutorService getExecutorService(RejectedExecutionHandler myRejectedExecutionHandler){
        return new ThreadPoolExecutor(2,5,
                1L, TimeUnit.MINUTES,
                new ArrayBlockingQueue<>(3),
                Executors.defaultThreadFactory(),
                myRejectedExecutionHandler);
    }

    @Provides
    @Singleton
    public RejectedExecutionHandler generateRejectedExecutionHandler(){
        return (r, executor) -> {
            MyRunnable r1 = (MyRunnable) r;
            System.out.println("报警信息："+r1.getTaskName()+" 被线程池拒绝，没有被执行");
            //可以发邮件通知.
        };
    }

}   
